/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica4;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;

/**
 *
 * @author manolo
 */
public class MatVectorConcurrente implements Runnable {

    private static int[][] matrizA;
    private static int[] matrizB;
    private static int[] resultado;
    private static int m, n, fila;
    private static Scanner teclado = new Scanner(System.in);

    public static void main(String[] args) throws InterruptedException {
        aleatoria();
        Date d = new Date();
        DateFormat df = new SimpleDateFormat("HH:mm:ss:SSS"); // formato para las variables de tipo fecha
        long inicCronom, finCronom; // variables del cronometro        
        inicCronom = System.currentTimeMillis(); //se prepara el cronometro
        d.setTime(inicCronom);
        producto();
        finCronom = System.currentTimeMillis(); //se para el cronometro
        d.setTime(finCronom);
        mostrarResultado();
        System.out.println("Producto de matriz realizado a las " + df.format(d) + " tras " + (finCronom - inicCronom) + " mseg.");

    }

    private static void aleatoria() {
        Random rm = new Random();

        System.out.println("Introduzca la dimensión de las filas de la matriz A: ");
        m = teclado.nextInt();
        System.out.println("Introduzca la dimensión de las columnas de la matriz A: ");
        n = teclado.nextInt();
        matrizA = new int[m][n];
        matrizB = new int[n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrizA[i][j] = rm.nextInt();
                matrizB[j] = rm.nextInt();
            }
        }
    }

    private static void producto() throws InterruptedException {
        Thread[] Hilo = new Thread[m];
        resultado = new int[m];

        for (fila = 0; fila < m; fila++) {
            Runnable tarea = new MatVectorConcurrente();
            Hilo[fila] = new Thread(tarea);
            Hilo[fila].start();
        }
        
        for (fila = 0; fila < m; fila++) {
            Hilo[fila].join();
        }
    }

    private static void mostrarResultado() {
        for (int i = 0; i < m; i++) {
            System.out.println(resultado[i]);
        }
    }

    @Override
    public void run() {
        resultado[fila] = 0;
        for (int k = 0; k < n; k++) {
            resultado[fila] += matrizA[fila][k] * matrizB[k];
        }
    }

}
